<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>闭包</title>
</head>

<body>
    <p>闭包是一种比较特殊和函数，使用闭包能够访问函数作用域中的变量。从代码形式上看闭包是一个做为返回值的函数</p>

    <p>
        总结：<br>

        1.怎么理解闭包？<br>

        - 闭包 = 内层函数 + 外层函数的变量<br>

        2.闭包的作用？<br>

        - 封闭数据，实现数据私有，外部也可以访问函数内部的变量<br>
        - 闭包很有用，因为它允许将函数与其所操作的某些数据（环境）关联起来<br>

        3.闭包可能引起的问题？<br>

        - 内存泄漏<br>

        闭包引起的内存泄漏<br>

        内存泄漏 是指程序不再使用某些数据，但这些数据却没有被释放，导致内存占用增加，最终可能导致程序性能下降或崩溃。在闭包的情况下，内存泄漏可能发生在以下几种情况中：<br>

        不必要的长时间引用：闭包会保留它们引用的外部变量的副本，这些变量可能会在闭包的整个生命周期内一直占用内存。如果闭包被长时间保存或在不再需要时未被正确释放，所引用的变量也无法被垃圾回收机制释放，导致内存泄漏。

    </p>
    <script>
        // 1、闭包： 内层函数 + 外层函数
        // function outer() {
        //     const a = 1
        //     function f() {
        //         console.log(a); // 1
        //     }
        //     f()
        // }
        // outer()


        // 2、闭包的应用： 实现数据的私有。统计函数的调用次数
        let count = 1
        function fn() {
            count++
            console.log(`函数被调用${count}次`); // 函数被调用2次
        }
        fn()

        // 3、闭包的写法 统计函数的调用次数
        // function outer() {
        //     let count = 1
        //     function fn() {
        //         count++
        //         console.log(`函数被调用${count}次`);
        //     }
        //     return fn
        // }
        // const re = outer()
        // re() // 函数被调用2次
        // re() // 函数被调用3次

        // 4、闭包存在的问题：可能会造成内存泄漏
        function createClosure() {
            let largeData = new Array(1000000).fill('memory leak example');
            return function () {
                console.log(largeData[0]);
            };
        }

        const closure = createClosure();
        // 这个闭包始终引用着大量数据，即使在不需要时，largeData也无法被回收



    </script>


</body>

</html>